package com.xuetang9.utils.sn;

import com.xuetang9.utils.LoggerUtils;

import java.util.Base64;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @类: PhoneLoginUtils
 * @描述: 手机登录工具类
 * @date: 2020/5/14
 * @author: Admin
 * @ver 1.0.0
 * @since JDK 1.8
 */
public final class PhoneLoginUtils {

    /**
     * 字符编码
     */
    private static final String CHARACTER = "UTF-8";

    /**
     * 解密存在错误，返回信息的Key
     */
    public static final String ERROR = "error";

    /**
     * 加密对象
     */
    public static final Base64.Encoder ENCODER = Base64.getEncoder();

    /**
     * 解密对象
     */
    public static final Base64.Decoder DECODER = Base64.getDecoder();

    /**
     * 时间键
     */
    public static final String DECRYPT_MESSAGE_PARAM_TIME = "time";


    /**
     * 根据传入的手机号返回加密信息（加密内容：手机号+时间）
     * @param phone 手机号
     * @throws Exception 字符串转换数组失败异常
     * @return 加密信息（加密内容：手机号+时间）
     */
    public static String encryptionPhoneAndTime(String phone) throws Exception {
        //获取当前时间
        Date date = new Date();
        Long time = date.getTime();
        LoggerUtils.debug("当前时间：{}",time);
        //拼接信息
        String message = phone + "_" + time;
        LoggerUtils.debug("拼接完的信息：{}",message);

        //加密
        String encryptionMessage = ENCODER.encodeToString(message.getBytes(CHARACTER));
        LoggerUtils.debug("加密的信息：{}",encryptionMessage);
        return encryptionMessage;
    }

    /**
     * 根据传入的加密信息进行解密
     * @param message 加密的信息
     * @return 解密后的信息(手机号phone+时间time)
     * @throws Exception 字符串转换数组失败异常
     */
    public static Map<String, String> decryptMessage(String message,String key) throws Exception {
        Map<String, String> stringMap = new HashMap<>(3);
        try {
            //解密
            String msg = new String(DECODER.decode(message), CHARACTER);
            LoggerUtils.debug("解密后的信息：{}" , msg);
            //解析解密后的字符串
            int index = msg.indexOf('_');
            String phone = msg.substring(0, index);
            String time = msg.substring(index + 1);
            LoggerUtils.debug("手机号：{}",phone);
            LoggerUtils.debug("时间：{}" , time);
            //返回解密后的信息
            stringMap.put(key, phone);
            stringMap.put(DECRYPT_MESSAGE_PARAM_TIME, time);
        } catch (Exception e) {
            //解密信息异常（加密的信息不对）
            stringMap.put(ERROR, "请使用正常方式登录！");
        }
        return stringMap;
    }
}
